Model fit

Column

Assumption checks


Something did not work as expected. Please file an issue at https://github.com/easystats/easystats/issues/ and post the following
  output:
  
``check_model()` not implemented for models of class `glm` yet.`

Column

Indices of model fit

Metric Value
AIC 1417.81
AICc 1418.00
BIC 1475.94
Tjur’s R2 0.07
RMSE 0.39
Sigma 0.98
Log_loss 0.48
Score_log -72.39
Score_spherical 8.72e-04
PCP 0.69

For interpretation of performance metrics, please refer to this documentation.

Parameter estimates

Column

Plot

Column

Tabular summary

Parameter Log-Odds SE 95% CI z p
(Intercept) -1.42 0.48 (-2.38, -0.49) -2.95 0.003
Unionized 0.31 0.16 (-0.01, 0.62) 1.92 0.055
Female 0.10 0.14 (-0.17, 0.37) 0.72 0.474
X003 -0.01 5.90e-03 (-0.02, -7.18e-04) -2.07 0.038
Educ (2) -0.05 0.27 (-0.57, 0.50) -0.19 0.846
Educ (3) 0.26 0.29 (-0.29, 0.84) 0.89 0.372
private sector -0.40 0.31 (-1.00, 0.24) -1.26 0.208
politicization 0.30 0.09 (0.12, 0.49) 3.19 0.001
Wave (Wave 6) 0.49 0.17 (0.16, 0.84) 2.84 0.005
Wave (Wave 7) -0.12 0.18 (-0.48, 0.24) -0.66 0.508
private sector × politicization -0.02 0.10 (-0.22, 0.18) -0.19 0.850

To find out more about table summary options, please refer to this documentation.

Predicted Values

Column

Plot

Column

Tabular summary

Text reports

Column

Textual summary

We fitted a logistic model (estimated using ML) to predict demonstr_dummy with Unionized, Female, X003, Educ, private_sector, politicization and Wave (formula: demonstr_dummy ~ Unionized + Female + X003 + Educ + private_sector + politicization + Wave + private_sector * politicization). The model’s explanatory power is weak (Tjur’s R2 = 0.07). The model’s intercept, corresponding to Unionized = 0, Female = 0, X003 = 0, Educ = 1, private_sector = 0, politicization = 0 and Wave = Wave 5, is at -1.42 (95% CI (-2.38, -0.49), p = 0.003). Within this model:

  • The effect of Unionized is statistically non-significant and positive (beta = 0.31, 95% CI (-0.01, 0.62), p = 0.055; Std. beta = 0.12, 95% CI (-4.21e-03, 0.25))
  • The effect of Female is statistically non-significant and positive (beta = 0.10, 95% CI (-0.17, 0.37), p = 0.474; Std. beta = 0.05, 95% CI (-0.09, 0.18))
  • The effect of X003 is statistically significant and negative (beta = -0.01, 95% CI (-0.02, -7.18e-04), p = 0.038; Std. beta = -0.15, 95% CI (-0.29, -8.79e-03))
  • The effect of Educ (2) is statistically non-significant and negative (beta = -0.05, 95% CI (-0.57, 0.50), p = 0.846; Std. beta = -0.05, 95% CI (-0.57, 0.50))
  • The effect of Educ (3) is statistically non-significant and positive (beta = 0.26, 95% CI (-0.29, 0.84), p = 0.372; Std. beta = 0.26, 95% CI (-0.29, 0.84))
  • The effect of private sector is statistically non-significant and negative (beta = -0.40, 95% CI (-1.00, 0.24), p = 0.208; Std. beta = -0.15, 95% CI (-0.28, -0.02))
  • The effect of politicization is statistically significant and positive (beta = 0.30, 95% CI (0.12, 0.49), p = 0.001; Std. beta = 0.45, 95% CI (0.32, 0.59))
  • The effect of Wave (Wave 6) is statistically significant and positive (beta = 0.49, 95% CI (0.16, 0.84), p = 0.005; Std. beta = 0.49, 95% CI (0.16, 0.84))
  • The effect of Wave (Wave 7) is statistically non-significant and negative (beta = -0.12, 95% CI (-0.48, 0.24), p = 0.508; Std. beta = -0.12, 95% CI (-0.48, 0.24))
  • The effect of private sector × politicization is statistically non-significant and negative (beta = -0.02, 95% CI (-0.22, 0.18), p = 0.850; Std. beta = -0.01, 95% CI (-0.13, 0.10))

Standardized parameters were obtained by fitting the model on a standardized version of the dataset. 95% Confidence Intervals (CIs) and p-values were computed using a Wald z-distribution approximation. The model’s explanatory power is weak (Tjur’s R2 = 0.07)

Column

Model information

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply differing number of rows: 1, 0
List of 47
 $ is_binomial     : logi TRUE
 $ is_bernoulli    : logi TRUE
 $ is_count        : logi FALSE
 $ is_poisson      : logi FALSE
 $ is_negbin       : logi FALSE
 $ is_beta         : logi FALSE
 $ is_betabinomial : logi FALSE
 $ is_dirichlet    : logi FALSE
 $ is_exponential  : logi FALSE
 $ is_logit        : logi TRUE
 $ is_probit       : logi FALSE
 $ is_censored     : logi FALSE
 $ is_truncated    : logi FALSE
 $ is_survival     : logi FALSE
 $ is_linear       : logi FALSE
 $ is_tweedie      : logi FALSE
 $ is_zeroinf      : logi FALSE
 $ is_zero_inflated: logi FALSE
 $ is_dispersion   : logi FALSE
 $ is_hurdle       : logi FALSE
 $ is_ordinal      : logi FALSE
 $ is_cumulative   : logi FALSE
 $ is_multinomial  : logi FALSE
 $ is_categorical  : logi FALSE
 $ is_mixed        : logi FALSE
 $ is_multivariate : logi FALSE
 $ is_trial        : logi FALSE
 $ is_bayesian     : logi FALSE
 $ is_gam          : logi FALSE
 $ is_anova        : logi FALSE
 $ is_timeseries   : logi FALSE
 $ is_ttest        : logi FALSE
 $ is_correlation  : logi FALSE
 $ is_onewaytest   : logi FALSE
 $ is_chi2test     : logi FALSE
 $ is_ranktest     : logi FALSE
 $ is_levenetest   : logi FALSE
 $ is_variancetest : logi FALSE
 $ is_xtab         : logi FALSE
 $ is_proptest     : logi FALSE
 $ is_binomtest    : logi FALSE
 $ is_ftest        : logi FALSE
 $ is_meta         : logi FALSE
 $ link_function   : chr "logit"
 $ family          : chr "binomial"
 $ n_obs           : int 1457
 $ n_grouplevels   : NULL
Error in DT::datatable(model_info_data): 'data' must be 2-dimensional (e.g. data frame or matrix)
---
title: "Regression model summary from `{easystats}`"
output: 
  flexdashboard::flex_dashboard:
    theme:
      version: 4
      # bg: "#101010"
      # fg: "#FDF7F7" 
      primary: "#0054AD"
      base_font:
        google: Prompt
      code_font:
        google: JetBrains Mono
params:
  model: model
  check_model_args: check_model_args
  parameters_args: parameters_args
  performance_args: performance_args
---

```{r setup, include=FALSE}
library(flexdashboard)
library(easystats)

# Since not all regression model are supported across all packages, make the
# dashboard chunks more fault-tolerant. E.g. a model might be supported in
# `{parameters}`, but not in `{report}`.
#
# For this reason, `error = TRUE`
knitr::opts_chunk$set(
  error = TRUE,
  out.width = "100%"
)

# helper function for printing `{report}` outputs
bracket_to_parantheses <- function(text) {
  gsub("]", ")", gsub("[", "(", text, fixed = TRUE), fixed = TRUE)
}
```

```{r easydashboard-1}
# Get user-specified model data
model <- params$model

# Is it supported by `{easystats}`? Skip evaluation of the following chunks if not.
is_supported <- insight::is_model_supported(model)

if (!is_supported) {
  unsupported_message <- sprintf(
    "Unfortunately, objects of class `%s` are not yet supported in {easystats}.\n
    For a list of supported models, see `insight::supported_models()`.",
    class(model)[1]
  )
}
```


Model fit 
=====================================  

Column {data-width=700}
-----------------------------------------------------------------------

### Assumption checks

```{r check-model, eval=is_supported, fig.height=10, fig.width=10}
check_model_args <- c(list(model), params$check_model_args)
# add verbose, if not done yet
if (is.null(check_model_args$verbose)) check_model_args$verbose <- FALSE
tryCatch(
  {
    do.call(performance::check_model, check_model_args)
  },
  error = function(e) {
    cat(insight::format_message(
      "\nSomething did not work as expected. Please file an issue at {.url https://github.com/easystats/easystats/issues/} and post the following output:",
      paste0("\n`", e$message, "`")
    ))
  }
)
```

```{r easydashboard-2, eval=!is_supported}
cat(unsupported_message)
```

Column {data-width=300}
-----------------------------------------------------------------------

### Indices of model fit

```{r easydashboard-3, eval=is_supported}
# `{performance}`
performance_args <- c(list(model), params$performance_args)
# add verbose, if not done yet
if (is.null(performance_args$verbose)) performance_args$verbose <- FALSE
table_performance <- do.call(performance::performance, performance_args)
print_md(table_performance, layout = "vertical", caption = NULL)
```


```{r easydashboard-4, eval=!is_supported}
cat(unsupported_message)
```

For interpretation of performance metrics, please refer to <a href="https://easystats.github.io/performance/reference/model_performance.html" target="_blank">this documentation</a>.

Parameter estimates
=====================================  

Column {data-width=550}
-----------------------------------------------------------------------

### Plot

```{r dot-whisker, eval=is_supported}
# `{parameters}`
parameters_args <- c(list(model), params$parameters_args)
# add verbose, if not done yet
if (is.null(parameters_args$verbose)) parameters_args$verbose <- FALSE
table_parameters <- do.call(parameters::parameters, parameters_args)

plot(table_parameters)
```


```{r easydashboard-5, eval=!is_supported}
cat(unsupported_message)
```

Column {data-width=450}
-----------------------------------------------------------------------

### Tabular summary

```{r easydashboard-6, eval=is_supported}
print_md(table_parameters, caption = NULL)
```


```{r easydashboard-7, eval=!is_supported}
cat(unsupported_message)
```

To find out more about table summary options, please refer to <a href="https://easystats.github.io/parameters/reference/model_parameters.html" target="_blank">this documentation</a>.


Predicted Values
=====================================  

Column {data-width=600}
-----------------------------------------------------------------------

### Plot

```{r expected-values, eval=is_supported, fig.height=10, fig.width=10}
# `{modelbased}`
int_terms <- find_interactions(model, component = "conditional", flatten = TRUE)
con_terms <- find_variables(model)$conditional

if (is.null(int_terms)) {
  model_terms <- con_terms
} else {
  model_terms <- clean_names(int_terms)
  int_terms <- unique(unlist(strsplit(clean_names(int_terms), ":", fixed = TRUE)))
  model_terms <- c(model_terms, setdiff(con_terms, int_terms))
}

# check some exceptions here: logistic regression models with factor response
# usually require the response to be included in the model, else `get_modelmatrix()`
# fails, which is required to compute SE/CI for `get_predicted()`
response <- find_response(model)
minfo <- model_info(model)
model_data <- get_data(model)
include_response <- minfo$is_binomial && minfo$is_logit && is.factor(model_data[[response]])

text_modelbased <- tryCatch(
  {
    lapply(unique(model_terms), function(i) {
      grid <- get_datagrid(
        model,
        at = i,
        range = "grid",
        preserve_range = FALSE,
        verbose = FALSE,
        include_response = include_response
      )
      estimate_expectation(model, data = grid, verbose = FALSE)
    })
  },
  error = function(e) {
    cat(insight::format_message(
      "\nSomething did not work as expected. Please file an issue at {.url https://github.com/easystats/easystats/issues/} and post the following output:",
      paste0("\n`", e$message, "`")
    ))
    NULL
  }
)

if (!is.null(text_modelbased)) {
  ggplot2::theme_set(theme_modern())
  # all_plots <- lapply(text_modelbased, function(i) {
  #   out <- do.call(visualisation_recipe, c(list(i), modelbased_args))
  #   plot(out) + ggplot2::ggtitle("")
  # })
  all_plots <- lapply(text_modelbased, function(i) {
    out <- visualisation_recipe(i, show_data = "none")
    plot(out) + ggplot2::ggtitle("")
  })

  see::plots(all_plots, n_columns = round(sqrt(length(text_modelbased))))
}
```


```{r easydashboard-8, eval=!is_supported}
cat(unsupported_message)
```

Column {data-width=400}
-----------------------------------------------------------------------

### Tabular summary

```{r easydashboard-9, eval=is_supported, results="asis"}
if (!is.null(text_modelbased)) {
  for (i in text_modelbased) {
    tmp <- print_md(i)
    tmp <- gsub("Variable predicted", "\nVariable predicted", tmp, fixed = TRUE)
    tmp <- gsub("Predictors modulated", "\nPredictors modulated", tmp, fixed = TRUE)
    tmp <- gsub("Predictors controlled", "\nPredictors controlled", tmp, fixed = TRUE)
    print(tmp)
  }
}
```


```{r easydashboard-10, eval=!is_supported}
cat(unsupported_message)
```


Text reports
=====================================    

Column {data-width=500}
-----------------------------------------------------------------------

### Textual summary

```{r easydashboard-11, eval=is_supported, results='asis', collapse=TRUE}
# `{report}`
text_report <- tryCatch(
  {
    report(model, verbose = FALSE)
  },
  error = function(e) {
    cat(insight::format_message(
      "\nSomething did not work as expected. Please file an issue at {.url https://github.com/easystats/easystats/issues/} and post the following output:",
      paste0("\n`", e$message, "`")
    ))
    NULL
  }
)


text_report_performance <- tryCatch(
  {
    report_performance(model, verbose = FALSE)
  },
  error = function(e) {
    cat(insight::format_message(
      "\nSomething did not work as expected. Please file an issue at {.url https://github.com/easystats/easystats/issues/} and post the following output:",
      paste0("\n`", e$message, "`")
    ))
    NULL
  }
)

if (!is.null(text_report)) {
  cat(bracket_to_parantheses(text_report))
  cat("\n")
}

if (!is.null(text_report_performance)) {
  cat(bracket_to_parantheses(text_report_performance))
}
```


```{r easydashboard-12, eval=!is_supported}
cat(unsupported_message)
```

Column {data-width=500}
-----------------------------------------------------------------------

### Model information

```{r easydashboard-13, eval=is_supported}
model_info_data <- insight::model_info(model, verbose = FALSE)
model_info_data <- datawizard::data_to_long(as.data.frame(model_info_data))

DT::datatable(model_info_data)
```

```{r easydashboard-14, eval=!is_supported}
cat(unsupported_message)
```